/*
 * @Author: aggfb 714740235@qq.com
 * @Date: 2024-04-22 21:39:52
 * @LastEditors: aggfb 714740235@qq.com
 * @LastEditTime: 2024-05-25 20:51:02
 * @FilePath: \label_rack_control\firmware\bsp\bsp_delay.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */
/*
 * @Author: aggfb 714740235@qq.com
 * @Date: 2024-04-20 11:28:05
 * @LastEditors: aggfb 714740235@qq.com
 * @LastEditTime: 2024-05-25 15:34:27
 * @FilePath: \label_rack_control\firmware\bsp\bsp_delay.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

#include "bsp_delay.h"
#include "bsp_sys.h"
#include "main.h"

#include "apm32f10x_misc.h"

static u8 fac_us = 0; // us延时倍乘数

// systick中断服务函数
void SysTick_Handler(void)
{
    ;
}

// 初始化延迟函数
// SYSTICK的时钟固定为AHB时钟，基础例程里面SYSTICK时钟频率为AHB/8
// 这里为了兼容FreeRTOS，所以将SYSTICK的时钟频率改为AHB的频率！
// SYSCLK:系统时钟频率
void bsp_delay_init()
{
//    uint8_t systickclk = 8;                           /* 系统时钟 */
    SysTick_ConfigCLKSource(SYSTICK_CLK_SOURCE_HCLK_DIV8); // SysTick时钟源选择AHB时钟8分频
    fac_us = 72 / 8;                         // 设置1us计数值
}

// 延时nus
// nus:要延时的us数.
// nus:0~204522252(最大值即2^32/fac_us@fac_us=168)
void bsp_delay_us(u32 nus)
{
    uint32_t temp;
	SysTick -> LOAD = nus * fac_us;
	SysTick -> VAL = 0;		        //计数器清零
	SysTick -> CTRL |= (1<<0);      //使能定时器SysTick
	do
	{
		temp = SysTick -> CTRL;	    //将CTRL寄存器的值赋给temp
	}while(!(temp & (1<<16)));	    //退出循环条件：标志位为1
	SysTick -> CTRL &= ~(1<<0);	    //失能定时器SysTick
	SysTick -> VAL = 0;	            //计数器清零
}

// 延时nms
// nms:要延时的ms数
// nms:0~65535
void bsp_delay_ms(u32 nms)
{
    for(uint16_t i = 0; i < nms; i++)
    {
        bsp_delay_us(1000);
    }
}
